package com.welkom.everydate.security.implementations;

import java.io.IOException;
import java.util.Collection;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.access.AccessDecisionManager;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityMetadataSource;
import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
import org.springframework.security.access.intercept.InterceptorStatusToken;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import org.springframework.stereotype.Service;  
import com.welkom.everydate.security.interfaces.CustomFilterSecurityInterceptor;


@Service("customFilterSecurityInterceptor")  
public class CustomFilterSecurityInterceptorImpl extends
		AbstractSecurityInterceptor implements CustomFilterSecurityInterceptor {
	
	
	@Resource  
    @Qualifier("customInvocationSecurityMetadataSource")  
    private FilterInvocationSecurityMetadataSource securityMetadataSource;  
	
	
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}
	
	 private void infoke(FilterInvocation fi) throws IOException, ServletException {  
	        InterceptorStatusToken token = super.beforeInvocation(fi);  
	        try {  
	            fi.getChain().doFilter(fi.getRequest(), fi.getResponse());  
	        } finally {  
	            super.afterInvocation(token, null);  
	        }  
	          
	    }  

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		 FilterInvocation fi = new FilterInvocation(request, response, chain);  
	     infoke(fi);  
	}

	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public Class<?> getSecureObjectClass() {
		// TODO Auto-generated method stub
		 return FilterInvocation.class;  
	}

	@Override
	public SecurityMetadataSource obtainSecurityMetadataSource() {
		// TODO Auto-generated method stub
		 return this.securityMetadataSource;  
	}
	
	
	@Resource  
    @Qualifier("customAccessDecisionManager")  
    @Override  
    public void setAccessDecisionManager(  
            AccessDecisionManager accessDecisionManager) {  
        // TODO Auto-generated method stub  
        super.setAccessDecisionManager(accessDecisionManager);  
    }  
	
	 @Resource  
	 @Qualifier("authenticationManager")  
	 @Override  
	public void setAuthenticationManager(AuthenticationManager newManager) {  
	      super.setAuthenticationManager(newManager);  
	}  
	 
	 public FilterInvocationSecurityMetadataSource getSecurityMetadataSource() {  
	        return securityMetadataSource;  
	 }  

}
